From 3f694d4013ab35147f58eee276bb7f1f7bc14553 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Mon, 31 Jul 2006 13:10:39 -0600 Subject: [PATCH] [IA64] bug fixes for recent ioports patch Bug fixes: dom0 do not virtualize IO space, do not over-deny IO ports. Signed-off-by: Tristan Gingold --- xen/arch/ia64/xen/mm.c | 23 +++++++++++++++++++++++ xen/include/asm-ia64/linux-xen/asm/io.h | 6 ++++++ 2 files changed, 29 insertions(+) diff --git a/xen/arch/ia64/xen/mm.c b/xen/arch/ia64/xen/mm.c index 5a24f06a8f..f968d57e69 100644 --- a/xen/arch/ia64/xen/mm.c +++ b/xen/arch/ia64/xen/mm.c @@ -908,6 +908,10 @@ ioports_permit_access(struct domain *d, unsigned long fp, unsigned long lp) if (ret != 0) return ret; + /* Domain 0 doesn't virtualize IO ports space. */ + if (d == dom0) + return 0; + fp_offset = IO_SPACE_SPARSE_ENCODING(fp) & ~PAGE_MASK; lp_offset = PAGE_ALIGN(IO_SPACE_SPARSE_ENCODING(lp)); @@ -918,6 +922,16 @@ ioports_permit_access(struct domain *d, unsigned long fp, unsigned long lp) return 0; } +static int +ioports_has_allowed(struct domain *d, unsigned long fp, unsigned long lp) +{ + unsigned long i; + for (i = fp; i < lp; i++) + if (rangeset_contains_singleton(d->arch.ioport_caps, i)) + return 1; + return 0; +} + int ioports_deny_access(struct domain *d, unsigned long fp, unsigned long lp) { @@ -936,9 +950,18 @@ ioports_deny_access(struct domain *d, unsigned long fp, unsigned long lp) for (off = fp_offset; off <= lp_offset; off += PAGE_SIZE) { unsigned long mpaddr = IO_PORTS_PADDR + off; + unsigned long port; volatile pte_t *pte; pte_t old_pte; + port = IO_SPACE_SPARSE_DECODING (off); + if (port < fp || port + IO_SPACE_SPARSE_PORTS_PER_PAGE > lp) { + /* Maybe this covers an allowed port. */ + if (ioports_has_allowed(d, port, + port + IO_SPACE_SPARSE_PORTS_PER_PAGE)) + continue; + } + pte = lookup_noalloc_domain_pte_none(d, mpaddr); BUG_ON(pte == NULL); BUG_ON(pte_none(*pte)); diff --git a/xen/include/asm-ia64/linux-xen/asm/io.h b/xen/include/asm-ia64/linux-xen/asm/io.h index 9c798f869c..3ad22c0547 100644 --- a/xen/include/asm-ia64/linux-xen/asm/io.h +++ b/xen/include/asm-ia64/linux-xen/asm/io.h @@ -47,6 +47,12 @@ #define IO_SPACE_SPARSE_ENCODING(p) ((((p) >> 2) << 12) | (p & 0xfff)) +#ifdef XEN +/* Offset to IO port; do not catch error. */ +#define IO_SPACE_SPARSE_DECODING(off) ((((off) >> 12) << 2) | (off & 0x3)) +#define IO_SPACE_SPARSE_PORTS_PER_PAGE (0x4 << (PAGE_SHIFT - 12)) +#endif + struct io_space { unsigned long mmio_base; /* base in MMIO space */ int sparse; -- 2.30.2